const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const port = process.env.PORT || 5500;
const path = require('path');

const Player = require('./player');
const Room = require('./room');
// Game 类代表一局游戏，以及游戏的数据处理
const Game = require('./game');
// new Game(Data.now(),'init')
// socket.join(game.roomName) 当前连接的客户端加入某个房间
// socket.to(game.roomName).emit() 发送给房间所有人除了自己
// io.to(game.roomName).emit() 发送给房间所有人
// socket.to(player.sid).emit() 单独发送给某个人 不能发给自己
// io.to(player.sid).emit() 单独发送给某个人 能发给自己 能连写
// io.to(sid).to(sid).emit() 连写
// socket.emit 只发给当前连接的客户端

app.use(express.static(path.join(__dirname, 'public')));

app.get('/', (req, res) => {
  res.sendFile('/public/index.html');
});

// 已登录的在线玩家列表 { name sid ip isHuman state roomIndex deskIndex} 
// 玩家昵称 socketID 是否当前在线 在哪个下标的房间 在房间游戏的几号位置
let players = [];
// rooms 代表当前服务器维护的所有游戏 Game 和房间 Room 信息 {roomIndex 房间编号 game:new Game(),desk:[player.name,],waiting} desk 房间的0 1 2 号位置 waiting true 时表示未开始游戏 false 表示正在游戏
let rooms = [];

let PlayerState = {
  "Error": 0,
  "Login": 1,
  "Reconnect": 2,
  "InRoomWaiting": 3,
  "InRoomGaming": 4
}

io.on('connection', (socket) => {
  console.log(socket.handshake.address);
  // 离线处理，如果玩家在游戏中，由机器人托管至游戏结束或玩家重连；否则，视为玩家退出登录。
  socket.on('disconnect', () => {
    let playerIndex = players.map(e => e.sid).indexOf(socket.id)
    if (playerIndex != -1) {
      players[playerIndex].isHuman = false;
    }
    // 如果已在房间中或开始游戏发送掉线信息给房间游戏中所有人
    // 否则发送在线玩家人数的信息给其他所有客户端
  })
  // 处理登录请求
  socket.on('login', (name, callback) => {
    let playerIndex = players.map(e => e.name).indexOf(name);
    let state = PlayerState.Error;
    // 接下来检查当前在线的玩家列表中有没有该昵称的玩家
    if (playerIndex != -1) {
      if (socket.handshake.address == players[playerIndex].ip) {
        // 有该昵称的在线玩家，判断属于同一ip，则视为掉线重连
        handleReconnectPlayer(playerIndex, socket.id);
        state = PlayerState.Reconnect;
        players[playerIndex].state = state;
        // 重连时将服务器保存的游戏状态发给客户端，客户端重新渲染进入游戏界面


      } else {
        // 拒绝玩家登录

      }
    } else {
      // 允许玩家登录
      state = PlayerState.Login;
      players.push(new Player(name, socket.id, socket.handshake.address));


    }
    // 调用客户端回调
    callback(state);

    // 发送更新在线玩家人数的信息给所有客户端
    io.emit("room")
    console.log(players);
  })
});

http.listen(port, () => {
  console.log(`server running at http://localhost:${port}/`);
});

function createRoom() {
  for (let i = 0; i < 6; i++) {
    rooms.push(new Room(i));
  }
}

function handleReconnectPlayer(index, sid) {
  console.log("玩家重连" + players[index]);
  // players[index].isHuman = true;
  // players[index].sid = sid;
  // 如果重连进入房间，发送房间信息
  // 如果重连进入游戏中，发送游戏信息
  // 更新所有玩家的在线玩家列表
}

createRoom()